package com.ordos.recruit.aop;

import cn.hutool.core.util.StrUtil;
import com.ordos.recruit.aop.config.NetworkConfineProp;
import com.ordos.recruit.module.user.entity.SysSsoUserDto;
import com.ordos.recruit.module.user.exception.UserLoginException;
import com.ordos.recruit.module.user.util.UserUtil;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 这是一个切面类。
 *
 * <p>
 *     1、主要使用的是方法前置处理注解.
 *     2、目的是, 当一个类使用了内网注解的服务时.
 *     3、外网不可以调用到, 当network.confine.internet属性为true时, 需要提示用户此接口暂未开放.
 *     4、使用注解@UnInternetApi进行api管理.
 * </p>
 *
 * @author ji
 */
@Aspect
@Component
@Order(0)
public class NetworkConfineAop {

    private final NetworkConfineProp networkConfineProp;

    public NetworkConfineAop(NetworkConfineProp networkConfineProp) {
        this.networkConfineProp = networkConfineProp;
    }

    /**
     * 添加这个注解的接口不允许外网访问，只有内网可以访问，并且必须为管理员
     */
    @Before("@annotation(com.ordos.recruit.aop.anno.UnInternetApi)")
    public void unInternetApi() throws Throwable {
        if ("out".equals(networkConfineProp.getStatus()) || StrUtil.isBlank(networkConfineProp.getStatus())) {
            throw new UserLoginException("非管理员暂无权限访问");
        }
        SysSsoUserDto userByRequest = UserUtil.getUserByRequest();

        if (userByRequest == null) {
            throw new UserLoginException("获取用户信息失败， 请检查当前Cookie状态.");
        }else{
            if(!userByRequest.getUserIsAdmin().equals("1")){
                throw new UserLoginException("非管理员暂无权限访问");
            }
        }
    }
}
